import fs from 'fs';
import path from 'path';
import archiver from 'archiver';
import { v4 as uuidv4 } from 'uuid';
import formidable from 'formidable';

// 禁用Next.js的请求体解析，因为我们使用formidable手动处理文件上传
export const config = {
  api: {
    bodyParser: false,
  },
};

// 配置上传和临时目录
const UPLOAD_DIR = path.join(process.cwd(), 'frontend/uploads');
const TEMP_DIR = path.join(process.cwd(), 'frontend/temp');

// 确保目录存在
if (!fs.existsSync(UPLOAD_DIR)) {
  fs.mkdirSync(UPLOAD_DIR, { recursive: true });
}
if (!fs.existsSync(TEMP_DIR)) {
  fs.mkdirSync(TEMP_DIR, { recursive: true });
}

export default async function handler(req, res) {
  if (req.method !== 'POST') {
    return res.status(405).json({
      code: 405,
      message: '方法不允许'
    });
  }

  try {
    // 使用formidable解析请求
    const form = new formidable.IncomingForm({
      uploadDir: TEMP_DIR,
      keepExtensions: true,
      maxFileSize: 100 * 1024 * 1024, // 100MB
      multiples: true, // 允许多文件上传
    });

    form.parse(req, async (err, fields, files) => {
      if (err) {
        console.error('文件上传错误:', err);
        return res.status(500).json({
          code: 500,
          message: '文件上传失败'
        });
      }

      // 获取压缩选项
      const level = fields.level ? fields.level[0] : 'medium';
      const format = fields.format ? fields.format[0] : 'zip';

      // 获取上传的文件列表
      const uploadedFiles = files.files;
      if (!uploadedFiles) {
        return res.status(400).json({
          code: 400,
          message: '没有选择文件'
        });
      }

      // 确保文件是数组
      const fileArray = Array.isArray(uploadedFiles) ? uploadedFiles : [uploadedFiles];
      
      if (fileArray.length === 0) {
        return res.status(400).json({
          code: 400,
          message: '没有选择文件'
        });
      }

      // 创建压缩文件
      const compressId = uuidv4();
      const compressFileName = `${compressId}.${format}`;
      const compressFilePath = path.join(TEMP_DIR, compressFileName);
      const output = fs.createWriteStream(compressFilePath);
      
      // 创建归档器
      const archive = archiver(format, {
        zlib: {
          level: level === 'low' ? 1 : level === 'medium' ? 5 : 9
        }
      });

      // 监听完成事件
      output.on('close', () => {
        // 压缩完成后，删除临时上传的文件
        fileArray.forEach(file => {
          if (file.filepath && fs.existsSync(file.filepath)) {
            fs.unlink(file.filepath, (err) => {
              if (err) console.error(`删除临时文件失败: ${file.filepath}`, err);
            });
          }
        });

        const stats = fs.statSync(compressFilePath);
        
        res.status(200).json({
          code: 200,
          message: '文件压缩成功',
          data: {
            fileId: compressId,
            fileName: compressFileName,
            size: stats.size,
            downloadUrl: `/api/file/download/${compressId}`
          }
        });
      });

      // 监听错误事件
      archive.on('error', (err) => {
        console.error('文件压缩错误:', err);
        res.status(500).json({
          code: 500,
          message: '文件压缩失败: ' + err.message
        });
      });

      // 将输出流附加到归档
      archive.pipe(output);

      // 添加文件到归档
      fileArray.forEach(file => {
        archive.file(file.filepath, { name: file.originalFilename });
      });

      // 完成归档
      archive.finalize();
    });
  } catch (error) {
    console.error('压缩上传文件异常:', error);
    res.status(500).json({
      code: 500,
      message: '服务器内部错误: ' + error.message
    });
  }
} 